package com.woniuxy.util;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 统一分页查询接收类
 */

//后端能映射(接收到)参数的要求:
//1. 数据结构对应
//2. 属性名称对应:
// 前端代码
//pageParam.pageNum = this.pageNum;
//pageParam.pageSize = this.pageSize;
//pageParam.param = this.param;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageParam<T> {
    private Integer pageNum;
    private Integer pageSize;
    private T param;

    /**
     * 对前端传递的分页参数进行非空判断
     * @param param 分页参数
     * @return 当且仅当 pageNum 和 pageSize 不为空时，返回 true
     */
    public static boolean isNull(PageParam<?> param) {
        return param == null || param.getPageNum() == null || param.getPageSize() == null;
    }

    /**
     * <p>对查询结果进行分页的方法。</p>
     * @param param 分页信息、查询参数
     * @param queryFunction 分页查询函数式接口实例
     * @return 分页信息 pageInfo 对象
     * @param <T> 参数类型
     */
    public static <T> PageInfo<T> executePageQuery(PageParam<T> param, Function<PageParam<T>, List<T>> queryFunction) {
        // 非空判断
        if (isNull(param)) return null;

        // 开启分页
        PageHelper.startPage(param.getPageNum(), param.getPageSize());

        // 执行查询
        List<T> resultList = queryFunction.apply(param);

        return new PageInfo<>(resultList);
    }
}
